/* -------------------------------------------------------------------------
 *
 * dict.c
 *		Standard interface to dictionary
 *
 * Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
 *
 *
 * IDENTIFICATION
 *	  src/backend/tsearch/dict.c
 *
 * -------------------------------------------------------------------------
 */
#include "postgres.h"
#include "knl/knl_variable.h"

#include "catalog/pg_type.h"
#include "tsearch/ts_cache.h"
#include "tsearch/ts_utils.h"
#include "utils/builtins.h"

/*
 * Lexize one word by dictionary, mostly debug function
 */
Datum ts_lexize(PG_FUNCTION_ARGS)
{
    ts_check_feature_disable();
    Oid dictId = PG_GETARG_OID(0);
    text* in = PG_GETARG_TEXT_P(1);
    ArrayType* a = NULL;
    TSDictionaryCacheEntry* dict = NULL;
    TSLexeme *res = NULL;
    TSLexeme *ptr = NULL;
    Datum* da = NULL;
    DictSubState dstate = {false, false, NULL};

    dict = lookup_ts_dictionary_cache(dictId);

    res = (TSLexeme*)DatumGetPointer(FunctionCall4(&dict->lexize,
        PointerGetDatum(dict->dictData),
        PointerGetDatum(VARDATA(in)),
        Int32GetDatum(VARSIZE(in) - VARHDRSZ),
        PointerGetDatum(&dstate)));

    if (dstate.getnext) {
        dstate.isend = true;
        ptr = (TSLexeme*)DatumGetPointer(FunctionCall4(&dict->lexize,
            PointerGetDatum(dict->dictData),
            PointerGetDatum(VARDATA(in)),
            Int32GetDatum(VARSIZE(in) - VARHDRSZ),
            PointerGetDatum(&dstate)));
        if (ptr != NULL) {
            res = ptr;
        }
    }

    if (res == NULL) {
        PG_RETURN_NULL();
    }

    ptr = res;
    while (ptr->lexeme)
        ptr++;
    da = (Datum*)palloc(sizeof(Datum) * (ptr - res));
    ptr = res;
    while (ptr->lexeme) {
        da[ptr - res] = CStringGetTextDatum(ptr->lexeme);
        ptr++;
    }

    a = construct_array(da, ptr - res, TEXTOID, -1, false, 'i');

    ptr = res;
    while (ptr->lexeme) {
        pfree(DatumGetPointer(da[ptr - res]));
        pfree_ext(ptr->lexeme);
        ptr++;
    }
    pfree_ext(res);
    pfree_ext(da);

    PG_RETURN_POINTER(a);
}

